package com.belizer.demo.dfa;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * 找到一段文本中的敏感词
 */
public class Demo {

    public static void main(String[] args) {

    }

    private static class DFAUtil {

        private static DFAUtil DFAUtil;

        private static Map<String, Object> DFAMap = new HashMap<>();

        /**
         * 如何保证DFAMap 只被初始化一次 并且初始化时 不会被用来检索呢？
         * <p>
         * <p>
         * 可以使用单例模式
         */
        private DFAUtil(String... sensitives) {
            initDFAMap(sensitives);
        }

        public static DFAUtil getInstance(String... sesitives) {

            //双重检查
            if (Objects.isNull(DFAUtil)
                    && DFAMap.size() == 0) {

                synchronized (DFAUtil.class){

                    if (Objects.isNull(DFAUtil)
                            && DFAMap.size() == 0) {
                        DFAUtil = new DFAUtil(sesitives);
                    }

                }

            }

            return DFAUtil;
        }

        /**
         * 把敏感词拆解成如下的树形结构
         *
         *{
         *     "匹": {
         *         "配": {
         *             "算": {
         *                 "法": {
         *                     "is_end": "True"
         *                 },
         *                 "is_end": "False"
         *             },
         *             "关": {
         *                 "键": {
         *                     "词": {
         *                         "is_end": "True"
         *                     },
         *                     "is_end": "False"
         *                 },
         *                 "is_end": "False"
         *             },
         *             "is_end": "False"
         *         },
         *         "is_end": "False"
         *     },
         *     "信": {
         *         "息": {
         *             "抽": {
         *                 "取": {
         *                     "is_end": "True"
         *                 },
         *                 "is_end": "False"
         *             },
         *             "is_end": "False"
         *         },
         *         "is_end": "False"
         *     }
         * }
         *
         * @param sensitives 所有敏感词
         */
        private void initDFAMap(String... sensitives) {

        }
    }


}
